package br.com.controller.aula;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import com.itextpdf.text.DocumentException;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.data.hibernate.AulaHibernateDAO;
import br.com.data.hibernate.ProfessorHibernateDAO;
import br.com.data.hibernate.SalaHibernateDAO;
import br.com.data.hibernate.TurmaHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Professor;
import br.com.model.entidade.Progresso;
import br.com.model.entidade.Sala;
import br.com.model.entidade.Turma;
import br.com.util.relatorios.RelatoriosAlunos;

@ManagedBean
@ViewScoped
public class MBAula extends AbstractMBean<Aula>{
	private AulaHibernateDAO aulaHibernateDAO;
	
	private Aula aula;
	private List<Aula> aulas;
	private boolean vizualizavel;
	private boolean editavel;
	private SalaHibernateDAO salaHibernateDAO;
	private ProfessorHibernateDAO professorHibernateDAO;
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBAula(){
		this.aulaHibernateDAO = (AulaHibernateDAO) getBean("aulaHibernateDAO");
		salaHibernateDAO = (SalaHibernateDAO) getBean("salaHibernateDAO");
		professorHibernateDAO = (ProfessorHibernateDAO) getBean("professorHibernateDAO");
		limpar();
		
	}
	
	public void verificarSala(){
		if (this.aula.getHorario().length()<0){
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Aviso", "Selecione um horário"));
		}else{
			if (!salaHibernateDAO.estaDisponivel(this.aula.getHorario(), this.aula.getSala())){
				this.aula.setSala(new Sala());
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro", "Sala não disponível nesse horário"));
			}
		}
		
		
	}
	
	public void verificarTurma(){
		
		TurmaHibernateDAO turmaHibernateDAO = (TurmaHibernateDAO) getBean("turmaHibernateDAO");
		
		if (turmaHibernateDAO.getById(Turma.class, this.aula.getTurma().getId()).getAlunos().size() > this.aula.getSala().getVagas()){
			addFacesErrorMessage("Essa turma possui mais alunos que a sala suporta. Por favor escolha outra sala ou outra turma.");
			this.aula.setTurma(new Turma());
		}
	}
	
	public void verificarProfessor(){
		
		if (this.aula.getHorario().length()<0){
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Aviso", "Selecione um horário"));
		}else{
			
			if (!professorHibernateDAO.estaDisponivel(this.aula.getHorario(), this.aula.getProfessor())){
				this.aula.setProfessor(new Professor());
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro", "Professor não disponível nesse horário"));
			}
		}
		
		
		
	}
	
	public void irEditar(){
		editavel = true;
		
	}
	
	public void mudarVizualizar(){
		vizualizavel = !vizualizavel;
		
	}
	
	public void excluir(){
		try {
			
			serviceCadastro.excluir(aula);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aula excluido com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir!"));
		}
	}
	
	public void editar(){
		try {
			serviceCadastro.atualizar(aula);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aula cadastrado com sucesso!"));
		
			
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void cadastrar(){
		try {
				
				serviceCadastro.salvar(aula);
				
				TurmaHibernateDAO turmaHibernateDAO = (TurmaHibernateDAO) getBean("turmaHibernateDAO");
			
				Progresso p;
				for (Aluno a : turmaHibernateDAO.getById(Turma.class, this.aula.getTurma().getId()).getAlunos()) {
					p = new Progresso();
					p.setAluno(a);
					p.setAula(aula);
					serviceCadastro.salvar(p);
				}
				this.limpar();
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aula cadastrado com sucesso!"));
			
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void limpar(){
		try {
			this.aulas = aulaHibernateDAO.listAll(Aula.class);
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.aula = new Aula();
		vizualizavel = false;
		editavel = false;
	}
	
	
	
	public Aula getAula() {
		return aula;
	}

	public void setAula(Aula Aula) {
		this.aula = Aula;
	}

	public List<Aula> getAulaes() {
		return this.aulas;
	}

	public void setAulaes(List<Aula> Aulaes) {
		
		
		this.aulas = Aulaes;
	}

	
	public boolean isVizualizavel() {
		return vizualizavel;
	}


	public void setVizualizavel(boolean vizualizavel) {
		this.vizualizavel = vizualizavel;
	}


	public boolean isEditavel() {
		return editavel;
	}


	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}
	
	
	
}
